package cn.diancan.Tags.utils;


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Locale;
import java.util.Map;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext; 


import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException; 

/**
 * @author ajun
 * @http://blog.csdn.net/ajun_studio  
 **/
public class FreeMarkertStaticUtil {

	
	private static  Configuration config = new Configuration(); 
	
	/** 
     * 初始化模板配置，供以后获得模板，在init里加载也主要是为保证Configuration实例唯一 
     */  
    public void init(ServletConfig config)  {
    	
        String templateDir = config.getInitParameter("templateDir");  
        FreeMarkertStaticUtil.initConfig(config.getServletContext(), templateDir);  
        
    }  
	
	/**
	 * @param templateName 模板名字
	 * @param root 模板根 用于在模板内输出结果集
	 * @param out 输出对象 具体输出到哪里
	 */
	public static void processTemplate(String templateName, Map<?,?> root, Writer out){
		try{
			//获得模板
			Template template=config.getTemplate(templateName,"utf-8");
			//生成文件（这里是我们是生成html）
			template.process(root, out);   
		    out.flush();   
		} catch (IOException e) {
			e.printStackTrace();
		} catch (TemplateException e) {
			e.printStackTrace();
		}finally{
			 try {
				out.close();
				out=null;
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	public static void analysisTemplate(String templatePath,String templateName,String fileName,Map<?,?>root){
		
		try {
		   Configuration config=new Configuration();
		  //设置要解析的模板所在的目录，并加载模板文件
		  config.setDirectoryForTemplateLoading(new File(templatePath));
		   //设置包装器，并将对象包装为数据模型
		   config.setObjectWrapper(new DefaultObjectWrapper());
		  //获取模板,并设置编码方式，这个编码必须要与页面中的编码格式一致
		 //否则会出现乱码
		   Template template=config.getTemplate(templateName,"UTF-8");
		   //合并数据模型与模板
		   FileOutputStream fos = new FileOutputStream(fileName);
		   Writer out = new OutputStreamWriter(fos,"UTF-8");
		      template.process(root, out);
		      out.flush();
		      out.close();
		  } catch (IOException e) {
		   e.printStackTrace();
		  }catch (TemplateException e) {
		   e.printStackTrace();
		  }
	}
	

    /**
* 生成静态页面主方法
* @param context ServletContext
* @param data 一个Map的数据结果集
* @param templatePath ftl模版路径
* @param targetHtmlPath 生成静态页面的路径
*/
public static boolean crateHTML(ServletContext context,Map<String,Object> data,String templatePath,String targetHtmlPath){
	Configuration cfg = new Configuration();
	//加载模版
	cfg.setServletContextForTemplateLoading(context, "/");
	cfg.setEncoding(Locale.getDefault(), "UTF-8");
	try {
		//指定模版路径
		Template template = cfg.getTemplate(templatePath,"UTF-8");
        //增加模板标签
		 //增加模板标签
        //cfg.setSharedVariable("ycs_city_list", new CityDirective());
        
		template.setEncoding("UTF-8");
		//静态页面路径
		String htmlPath = context.getRealPath("")+"/"+targetHtmlPath;
		File htmlFile = new File(htmlPath);
		BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(htmlFile), "UTF-8"));
       //处理模版  
       template.process(data, out);
       out.flush();
       out.close();
       
       String fil= readFile(htmlPath);
       if(-1!=fil.indexOf("请联系管理员") || -1!= fil.indexOf("Exception")){
    	   return false;
       }
       if(-1!=fil.indexOf("首页底部结束")){
    	   return true;
       }
       return false;
	} catch (Exception e) {
		e.printStackTrace();
		return false;
	}
}

	public  static String readFile(String filePath) {
		String allTxt = "";
		try {
			String encoding = "UTF-8";
			File file = new File(filePath);
			if (file.isFile() && file.exists()) { // 判断文件是否存在
				InputStreamReader read = new InputStreamReader(
						new FileInputStream(file), encoding);// 考虑到编码格式
				BufferedReader bufferedReader = new BufferedReader(read);
				String lineTxt = null;
				while ((lineTxt = bufferedReader.readLine()) != null) {
					allTxt += lineTxt.trim();
				}
				read.close();
			} else {
				System.out.println("找不到指定的文件");
			}
		} catch (Exception e) {
			System.out.println("读取文件内容出错");
			e.printStackTrace();
		}
		return allTxt;
	}

	
	/**
	 * 初始化模板配置
	 * @param servletContext javax.servlet.ServletContext
	 * @param templateDir 模板位置
	 */
	public static void initConfig(ServletContext servletContext,String templateDir){
		 	config.setLocale(Locale.CHINA);
		    config.setDefaultEncoding("utf-8");
		    config.setEncoding(Locale.CHINA, "utf-8");
		    config.setServletContextForTemplateLoading(servletContext, templateDir);
		    config.setObjectWrapper(new DefaultObjectWrapper());
	}
}
